// run: $exec < input
#include <iostream>
#include <iomanip>
#include <algorithm>
#include <cstring>
#include <vector>

struct coord { long long x, y; };

double const eps = 1e-7;
int const maxn = 100007;
bool vis[maxn];
long long lminx[maxn], lmaxx[maxn];
long long rminx[maxn], rmaxx[maxn];
int n;

std::vector<coord> da;

bool judge(double width)
{
	for (int i = 0, j = 0; i < n; i++) {
		while (j < n && da[j].y - da[i].y <= width) j++;
		long long max = -2e9, min = 2e9;
		if (!i && j >= n) return true;
		if (i) {
			max = std::max(max, lmaxx[i - 1]);
			min = std::min(min, lminx[i - 1]);
		}
		if (j < n) {
			max = std::max(max, rmaxx[j]);
			min = std::min(min, rminx[j]);
		}
		if (max - min <= width) return true;
	}
	return false;
}

int main()
{
	std::ios::sync_with_stdio(false);
	std::cin >> n;
	da.resize(n);
	for (int i = 0; i < n; i++) {
		long long x, y;
		std::cin >> x >> y;
		da[i].x = x + y;
		da[i].y = y - x;
	}
	std::sort(da.begin(), da.end(), [](coord const & a, coord const & b) {
				return a.y < b.y || (a.y == b.y && a.x < b.x);
			});

	lminx[0] = lmaxx[0] = da[0].x;
	for (int i = 1; i < n; i++) {
		lminx[i] = std::min(lminx[i - 1], da[i].x);
		lmaxx[i] = std::max(lmaxx[i - 1], da[i].x);
	}
	rminx[n - 1] = rmaxx[n - 1] = da[n - 1].x;
	for (int i = n - 2; i >= 0; i--) {
		rminx[i] = std::min(rminx[i + 1], da[i].x);
		rmaxx[i] = std::max(rmaxx[i + 1], da[i].x);
	}

	double l = 0, r = 4e9;
	while (l + eps < r) {
		double mid = (l + r) / 2.0;
		if (judge(2.0 * mid)) r = mid;
		else l = mid;
	}
	std::cout << std::setprecision(7) << std::fixed << r << '\n';
}

